﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Data;
using SIMCObjetoNegocio;

namespace SIMCRepositorio
{
    public interface IRepositorioSeguridad
    {
        FuncionConSeguridad BuscarFuncionConSeguridad(string p_objeto, string p_evento);
        int CrearFuncionSeguridad(FuncionConSeguridad p_funcion);        
        Permiso BuscarPermiso(FuncionConSeguridad p_funcion, Usuario p_Usuario);
        void EliminarFuncionConSeguridad(FuncionConSeguridad p_Funcion);
        void ActualizarFuncion(FuncionConSeguridad p_Funcion);

        List<FuncionConSeguridad> BuscarListaFuncionConSeguridad(string p_objeto, string p_evento);

        List<FuncionConSeguridad> BuscarListaFuncionConSeguridad(string p_Objeto, string p_Evento, int p_IdUsuario, string p_Perfil);

        List<string> BuscarPreguntasDeSeguridad();
    }

    public class RepositorioSeguridad : Database, IRepositorioSeguridad
    {
        public FuncionConSeguridad BuscarFuncionConSeguridad(string p_objeto, string p_evento)
        {
            try
            {
                var query = from valor in Context.seg_eventos
                            where valor.sev_evento == p_evento && valor.sev_objeto == p_objeto
                            select new FuncionConSeguridad
                            {
                                Descripcion = valor.sev_descripcion,
                                Evento = valor.sev_evento,
                                ID = valor.sev_idevento,
                                Objeto = valor.sev_objeto,
                                Password = valor.sev_spwd,
                                TipoRestriccion = valor.sev_ctp_restriccion
                            };

                return query.SingleOrDefault();
            }
            catch (Exception ex)
            {
                throw ex;
            }
        }

        public List<FuncionConSeguridad> BuscarListaFuncionConSeguridad(string p_objeto, string p_evento)
        {
            try
            {
                var query = from valor in Context.seg_eventos
                            where valor.sev_evento.Contains(p_evento) && valor.sev_objeto == p_objeto
                            select new FuncionConSeguridad
                            {
                                Descripcion = valor.sev_descripcion,
                                Evento = valor.sev_evento,
                                ID = valor.sev_idevento,
                                Objeto = valor.sev_objeto,
                                Password = valor.sev_spwd,
                                TipoRestriccion = valor.sev_ctp_restriccion
                            };

                return query.ToList();
            }
            catch (Exception ex)
            {
                throw ex;
            }
        }

        public int CrearFuncionSeguridad(FuncionConSeguridad p_funcion)
        {
            try
            {
                seg_eventos evento = new seg_eventos
                    {
                        sev_ctp_restriccion = p_funcion.TipoRestriccion,
                        sev_descripcion = p_funcion.Descripcion,
                        sev_evento = p_funcion.Evento,
                        sev_objeto = p_funcion.Objeto,
                        sev_spwd = p_funcion.Password
                    };

                Insertar(evento);

                return evento.sev_idevento;
            }
            catch (Exception ex)
            {                
                throw ex;
            }
        }      
        
        public Permiso BuscarPermiso(FuncionConSeguridad p_funcion, Usuario p_usuario)
        {
            try
            {
                string id = p_usuario.Id.ToString();
                var query = from valor in Context.seg_derechos
                            where valor.sde_idevento == p_funcion.ID 
                            && (valor.sde_scodigo == id || valor.sde_scodigo == p_usuario.Rol.Id)
                            select new Permiso
                            {
                                FechaLimite = valor.sde_flimite,
                                IdFuncion = valor.sde_idevento,
                                _IdUsuarioPerfil = valor.sde_scodigo,
                                TipoPermiso = valor.sde_cderecho,
                                PermisoPara = valor.sde_cgr_user
                            };

                return query.FirstOrDefault();
            }
            catch (Exception ex)
            {
                throw ex;
            }
        }
        
        public void EliminarFuncionConSeguridad(FuncionConSeguridad p_funcion)
        {
            try
            {
                Eliminar(ToEntity(p_funcion));
            }
            catch (Exception ex)
            {
                throw ex;
            }            
        }        
        
        public void ActualizarFuncion(FuncionConSeguridad p_funcion)
        {
            try
            {
                Modificar(ToEntity(p_funcion));
            }
            catch (Exception ex)
            {
                throw ex;
            }            
        }

        private static seg_eventos ToEntity(FuncionConSeguridad p_funcion)
        {
            seg_eventos evento = new seg_eventos
            {
                sev_idevento = p_funcion.ID,
                sev_objeto = p_funcion.Objeto,
                sev_descripcion = p_funcion.Descripcion,
                sev_ctp_restriccion = p_funcion.TipoRestriccion,
                sev_evento = p_funcion.Evento,
                sev_spwd = p_funcion.Password
            };

            return evento;
        }        

        public List<FuncionConSeguridad> BuscarListaFuncionConSeguridad(string p_Objeto, string p_Evento, int p_IdUsuario, string p_Perfil)
        {
            try
            {
                string idUsuario = p_IdUsuario.ToString();
                var query = (from valor in Context.seg_eventos
                             join derecho in Context.seg_derechos on valor.sev_idevento equals derecho.sde_idevento
                             where valor.sev_objeto == p_Objeto && valor.sev_evento.Contains(p_Evento) && (derecho.sde_scodigo == p_Perfil || derecho.sde_scodigo == idUsuario)
                             select new FuncionConSeguridad
                             {
                                 Descripcion = valor.sev_descripcion,
                                 Evento = valor.sev_evento,
                                 ID = valor.sev_idevento,
                                 Objeto = valor.sev_objeto,
                                 Password = valor.sev_spwd,
                                 TipoRestriccion = valor.sev_ctp_restriccion
                             }

                             ).Distinct();

                return query.ToList();
            }
            catch (Exception ex)
            {
                throw ex;
            }
        }


        public List<string> BuscarPreguntasDeSeguridad()
        {            
            List<ValorDeAtributo> valores = DatabaseAccess.ValorRepositorio.BuscarLista(Valores.PreguntasDeSeguridad.ToString());

            Random rdm = new Random();

            List<string> PreguntasDeSeguridad = ((from v in valores orderby rdm.Next() select v.Descripcion).Take(3)).ToList();

            return PreguntasDeSeguridad;
        }
    }
}
